package com.fengye.resign.config;

import com.fengye.common.constants.CommonConstant;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.RequestParameterBuilder;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.Collections;

/**
 * 访问路径：<a href="http://localhost:8080/swagger-ui/index.html">...</a>
 * @author sunlei
 */
@EnableOpenApi
@Configuration // 标明是配置类
public class SwaggerConfig {

    @Value("${swagger.enable: false}")
    private boolean swaggerEnable;

    private String version = "1.0";

    /**
     * 用于定义API主界面的基本信息，比如可以声明所有的API的总标题、描述、版本
     * @return ApiInfo
     */
    private ApiInfo apiInfo() {
        Contact contact = new Contact("枫叶🍁", "https://www.baidu.com","example@qq.com");
        return new ApiInfoBuilder()
                .title("智慧办公项目API") //  可以用来自定义API的主标题
                .description("智慧办公项目SwaggerAPI管理") // 可以用来描述整体的API
                .termsOfServiceUrl("") // 用于定义服务的域名
                .version(version) // 可以用来定义版本。
                .contact(contact)
                .build(); //
    }

    /**
     * 配置文档生成最佳实践
     * @return Docket
     */
    @Bean
    public Docket createRestApi() {
        // RequestParameter requestParameter = new RequestParameterBuilder().name(CommonConstant.HTTP_HEADER_TOKEN_KEY).in(ParameterType.HEADER).build();
        return new Docket(DocumentationType.OAS_30)  // DocumentationType.SWAGGER_2 固定的，代表swagger2
                // 配置全局参数
                // .globalRequestParameters(Collections.singletonList(requestParameter))
                .groupName("API系统") // 如果配置多个文档的时候，那么需要配置groupName来分组标识
                .apiInfo(apiInfo()) // 用于生成API信息
                .enable(swaggerEnable) // 是否开启Swagger，正式环境一般是需要关闭的，可根据springboot的多环境配置进行设置
                .securitySchemes(Collections.singletonList(tokenScheme())) // 配置认证
                .securityContexts(Collections.singletonList(tokenContext())) //
                .select() // select()函数返回一个ApiSelectorBuilder实例,用来控制接口被swagger做成文档
                .apis(RequestHandlerSelectors.basePackage("com.fengye.resign.controller")) // 用于指定扫描哪个包下的接口
                .paths(PathSelectors.any())// 选择所有的API,如果你想只为部分API生成文档，可以配置这里
                .build();
    }

    /**
     * 配置bearer token Scheme对象
     * @return HttpAuthenticationScheme
     */
    private HttpAuthenticationScheme tokenScheme() {
        return HttpAuthenticationScheme.JWT_BEARER_BUILDER.name(CommonConstant.HTTP_HEADER_BEARER_KEY).build();
    }

    /**
     * 配置bearer token
     * @return SecurityContext
     */
    private SecurityContext tokenContext() {
        return SecurityContext.builder()
                .securityReferences(Collections.singletonList(SecurityReference.builder()
                        .scopes(new AuthorizationScope[0])
                        .reference(CommonConstant.HTTP_HEADER_BEARER_KEY)
                        .build()))
                .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
                .build();
    }
}

